程式挑戰:全域變數和區域變數可視範圍 Variable Scope

Posted by HappyCoder 自學程式設計學院 on 2019-12-27

題目

給定 C 語言程式如下,其中 s 被宣告為全域變數,給定值為 1。請問最後程式執行後輸出為何?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>


int s = 1; // 全域變數

void add(int a) {
int s = 6;
for (; a >= 0; a = a - 1) {
printf("%d, ", s);
s++;
printf("%d, ", s);
}
}

int main() {
printf("%d, ", s);
add(s);
printf("%d, ", s);
s = 9;
printf("%d", s);
return 0;
}

(A) 1, 6, 7, 7, 8, 8, 9
(B) 1, 6, 7, 7, 8, 1, 9
(C) 1, 6, 7, 8, 9, 9, 9
(D) 1, 6, 7, 7, 8, 9, 9

參考解答

答案為 (B) 1, 6, 7, 7, 8, 1, 9

本程式挑戰主要在測試同學對於「全域變數」(Global variable)、「區域變數」(Local variable)的生命週期和變數可視範圍(Scope)的理解。若是函數內沒有宣告變數卻使用該變數,則會往外看是否有同名變數,若有則使用該變數。在主程式外的宣告的變數為全域變數,程式內的跨函式都可以存取、修改該變數,若是在函式內宣告的變數或參數變數則為區域變數,區域變數存取修改權僅限於該函式內,函式結束即消失。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdio.h>

// 全域變數
int s = 1;

void add(int a) {
// 區域變數 s
int s = 6;
// 區域變數 a,值為 1
for (; a >= 0; a = a - 1) {
// 迴圈兩次,第一次印出 6,第二次印出 7
printf("%d, ", s);
// s = s + 1
s++;
// 迴圈兩次,第一次印出 7,第二次印出 8
printf("%d, ", s);
}
}

int main() {
// s 在主程式中找不到,所以為全域變數 s,值為 1
printf("%d, ", s);
// 複製傳入參數值為 1
add(s);
// 全域變數 s,值為 1
printf("%d, ", s);
// 更改全域變數 s,值為 9
s = 9;
printf("%d", s);
return 0;
}

我們可以透過觀察程式執行的過程來判斷(在 C 語言我們以主程式 main() 為執行區塊,由上往下執行):例如在 main() 函式內部 s = 9; 這行之前的 s 使用的是全域變數 1。因此傳入 add() 函式的 a 參數為 1。因此 for 迴圈會進行兩次後結束,印出 6, 7, 7, 8add 函式內的 s 為自己內部宣告的區域變數非外部的全域變數 1,所以不影響到全域變數 s

最後main() 函式內部使用到的 s 全域變數(前面沒有設定變數型別),被改成 9

1
s = 9

所以結果為:1, 6, 7, 7, 8, 1, 9

另外還有區塊變數(Block variable)是指宣告在某個陳述句區塊之中的變數,例如 while 迴圈或是 for 迴圈區塊內使用,區塊結束即消逝。

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>

int main() {
int i = 101;

for (int i = 0; i < 10; i++) {
// 不受外面的 i 影響
printf("%d", i);
}
// 印出的是 101
printf("%d", i);
}

其結果為:0123456789101

參考文件

  1. Wiki C 語言
  2. csie ntnu


喜歡我們的文章嗎?歡迎分享按讚給予我們支持和鼓勵!



在 Facebook 上追蹤我們,立即掌握最新和最豐富的程式設計自學資訊!


更多程式設計教學文章




Comments: